#include <stdio.h>

/*
 * 解法概述
 *
 * 使用递归函数的方式，枚举n个数的所有可能的选择情况。
 * 对于每一种选择情况，判断数字之和是否为T，如果为T则进行输出。
 */

int arr[23] = {0};      // 记录原始数组
int selected[23] = {0}; // 记录选择方案
int n;                  // 数字总数

// 输出方案，如果当前方案有效，则返回1
int output_solution() {
  // 判断当前的selected是否构成一个有效的方案
  int select_count = 0;
  int i = 0;
  for (i = 0; i < n; i++) {
    if (selected[i] > 0)
      select_count++;
  }
  if (select_count == 0) {
    // 全都没选择，无效
    return 0;
  }
  for (i = 0; i < n; i++) {
    if (selected[i] > 0)
      printf("%d ", arr[i]);
  }
  printf("\n");
  return 1;
}

// 递归函数
// 求解使用前n个数（n从1开始）凑成和为T的方案总数。
//     输入参数：n（前n个数），T寻找的目标和
//     返回值：符合要求的方案数量
// 注：函数会访问arr数组，并修改selected数组（记录当前的选择方案）
int find_solution(int n, int T) {
  int solution_count = 0;
  if (n == 1) {
    // 已经搜索到第1个数，有两种可能性：选则或不选
    selected[n - 1] = 0; // 不选择优先
    if (T == 0) {
      // 不选择第一个数参加和，符合要求
      solution_count += output_solution();
    }
    if (arr[n - 1] == T) {
      // 选择第1个数参加和，也符合要求
      selected[n - 1] = 1;
      solution_count += output_solution();
    }
    selected[n - 1] = 0; // 恢复不选择的状态
  } else {
    // 其他数：有两种可能性：不参加、参加
    // 优先处理不参加的情况
    selected[n - 1] = 0;
    solution_count += find_solution(n - 1, T); // 前n-1个数需要凑成T
    // 再处理参加和的情况
    selected[n - 1] = 1;
    solution_count += find_solution(n - 1, T - arr[n - 1]);
    selected[n - 1] = 0; // 恢复为默认不参加的情况
  }
  return solution_count;
}

int main(void) {
  scanf("%d", &n);
  int i = 0;
  for (i = 0; i < n; i++)
    scanf("%d", &arr[i]);
  int T = 0;
  scanf("%d", &T);
  // 递归搜索所有的方案
  int solution_count = find_solution(n, T);
  printf("%d\n", solution_count);
  return 0;
}
